-- ==========================================================
-- ==             Wind Turbine Smart Controller            ==
-- ==========================================================
-- 定期请求能源数据，并根据存储百分比智能控制风力发电机。
-- 带有超时故障保护机制。
-- 已根据用户反馈进行最终修正。
-- ==========================================================

-- 引入必要的模块
local Component = require("component")
local event = require("event")
local sides = require("sides")
local serialization = require("serialization")

-- ================== 配置项 ==================
local POLLING_INTERVAL = 10
local RESPONSE_TIMEOUT = 5
local STOP_THRESHOLD_PERCENT = 0.90
local START_THRESHOLD_PERCENT = 0.70
local REDSTONE_SIDE = sides.up
-- =========================================

-- 获取组件代理
local tunnel = Component.tunnel
local redstone = Component.redstone

-- 检查组件是否存在
if not tunnel then error("错误：找不到 P2P 通道 (tunnel) 组件。") end
if not redstone then error("错误：找不到红石 IO (redstone) 组件。") end

print("风力发电机控制器已初始化。")
print("红石输出方向: up")

local is_running = true
redstone.setOutput(REDSTONE_SIDE, 0)
print("初始状态：启动发电机。")

while true do
  print("正在向服务器请求能源状态...")
  
  while event.pull(0, "modem_message") do end
  
  tunnel.send("request_energy")
  
  local _, _, _, _, _, response_raw = event.pull(RESPONSE_TIMEOUT, "modem_message")
  
  if response_raw then
    local response = serialization.unserialize(response_raw)
    
    if response and response.success then
      local data = response.data
      -- 【已修正】使用 tostring() 和局部格式化，避免 %d 错误
      local percent_string = string.format("%.2f%%", (data.energy / data.capacity) * 100)
      print("收到响应: " .. tostring(data.energy) .. " / " .. tostring(data.capacity) .. " EU (" .. percent_string .. ")")
      
      local current_percent = data.energy / data.capacity
      if current_percent >= STOP_THRESHOLD_PERCENT and is_running then
        print("决策：能量已满，关闭发电机。")
        redstone.setOutput(REDSTONE_SIDE, 15)
        is_running = false
      elseif current_percent < START_THRESHOLD_PERCENT and not is_running then
        print("决策：能量不足，启动发电机。")
        redstone.setOutput(REDSTONE_SIDE, 0)
        is_running = true
      else
        print("决策：无需改变当前状态。")
      end
    else
      print("警告：服务器返回错误信息: " .. (response and response.message or "未知错误"))
    end
  else
    print("警告：服务器响应超时！")
    if not is_running then
      print("故障保护：因无法连接服务器，强制启动发电机以确保能源供应。")
      redstone.setOutput(REDSTONE_SIDE, 0)
      is_running = true
    end
  end
  
  print("下一次检查将在 " .. POLLING_INTERVAL .. " 秒后。")
  os.sleep(POLLING_INTERVAL)
end
